<?php

namespace App\Http\Controllers\OperationManagement;

use App\Models\CarModels\CarArea;
use App\Models\SystemManagement\Employee;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\OperationManagement\SanitationToilet;
use Illuminate\Database\QueryException;
use App\Http\Requests\OperationManagement\SanitationToiletRequest;
use Grimzy\LaravelMysqlSpatial\Types\Point;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;

/**
 * @group 基础信息管理->环卫->公厕数据
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */

class SanitationToiletController extends Controller
{
    /**
     * 公厕数据查看列表
     *
     * @bodyParam name string 公厕名称
     * @bodyParam principal_id int 负责人id 外键 员工表
     * @bodyParam area_id int 所属区域 外键 城市信息表
     * @bodyParam location string 经纬度-点 115.24556 25.14551
     *
     * @queryParam name string 公厕名称
     * @queryParam number string 公厕编号
     * @queryParam address string 公厕地址
     * @queryParam area_id int 所属区域 外键 城市信息表
     * @queryParam areas->name string 区域名称
     * @queryParam areas->city->name string 城市名称
     * @queryParam location string 经纬度-点 115.24556 25.14551
     * @queryParam company string  所属公司
     * @queryParam type int  厕所类型 0临时厕所 1旅游厕所 2普通厕所
     * @queryParam man_squatting int 男蹲位
     * @queryParam woman_squatting int 女蹲位
     * @queryParam restroom int 无障碍卫生间
     * @queryParam third_toilet int 第三卫生间
     * @queryParam frequency int 保洁频次
     * @queryParam status int 厕所状态 0在用 1停用 2维修
     * @queryParam device_name string 设备名称
     * @queryParam imei char 设备唯一imei
     * @queryParam principal_id int 负责人id 外键 员工表
     * @queryParam phone string 电话
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $sanitationToilet = new SanitationToilet;
        $data = $sanitationToilet->getList($request);
        return response()->json(encodeMsg($data,200));
    }

    /**
     * 新增公厕数据
     *
     * @bodyParam name string 公厕名称
     * @bodyParam number string 公厕编号
     * @bodyParam address string 公厕地址
     * @bodyParam area_id int 所属区域 外键 城市信息表
     * @bodyParam location string 经纬度-点 115.24556 25.14551
     * @bodyParam company string  所属公司
     * @bodyParam type int  厕所类型 0临时厕所 1旅游厕所 2普通厕所
     * @bodyParam man_squatting int 男蹲位
     * @bodyParam woman_squatting int 女蹲位
     * @bodyParam restroom int 无障碍卫生间
     * @bodyParam third_toilet int 第三卫生间
     * @bodyParam frequency int 保洁频次
     * @bodyParam status int 厕所状态 0在用 1停用 2维修
     * @bodyParam device_name string 设备名称
     * @bodyParam imei char 设备唯一imei
     * @bodyParam principal_id int 负责人id 外键 员工表
     * @bodyParam phone string 电话
     *
     * @queryParam name string 公厕名称
     * @queryParam number string 公厕编号
     * @queryParam address string 公厕地址
     * @queryParam area_id int 所属区域 外键 城市信息表
     * @queryParam areas->name string 区域名称
     * @queryParam areas->city->name string 城市名称
     * @queryParam location string 经纬度-点 115.24556 25.14551
     * @queryParam company string  所属公司
     * @queryParam type int  厕所类型 0临时厕所 1旅游厕所 2普通厕所
     * @queryParam man_squatting int 男蹲位
     * @queryParam woman_squatting int 女蹲位
     * @queryParam restroom int 无障碍卫生间
     * @queryParam third_toilet int 第三卫生间
     * @queryParam frequency int 保洁频次
     * @queryParam status int 厕所状态 0在用 1停用 2维修
     * @queryParam device_name string 设备名称
     * @queryParam imei char 设备唯一imei
     * @queryParam principal_id int 负责人id 外键 员工表
     * @queryParam phone string 电话
     *
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        try {
            $data = $request->all();
            $location = $request->input('location','');
            if(!empty($location)){
                $data['location'] = Point::fromString($location);
            }
            $number = SanitationToilet::orderBy('number','desc')->value('number');
            if(is_null($number)){
                $data['number'] = 1;
            }else{
                $data['number'] = seriesNum($number);
            }
            $data = SanitationToilet::create($data);
            return response()->json(encodeMsg($data,201));
        } catch (QueryException $e) {
            // dd($e);
            return response()->json(encodeMsg(['message' => '公厕信息添加失败!'],400));
        }
    }

    /**
     * 查看公厕数据
     *
     * @bodyParam id int required 表id
     *
     * @queryParam name string 公厕名称
     * @queryParam number string 公厕编号
     * @queryParam address string 公厕地址
     * @queryParam area_id int 所属区域 外键 城市信息表
     * @queryParam areas->name string 区域名称
     * @queryParam areas->city->name string 城市名称
     * @queryParam location string 经纬度-点 115.24556 25.14551
     * @queryParam company string  所属公司
     * @queryParam type int  厕所类型 0临时厕所 1旅游厕所 2普通厕所
     * @queryParam man_squatting int 男蹲位
     * @queryParam woman_squatting int 女蹲位
     * @queryParam restroom int 无障碍卫生间
     * @queryParam third_toilet int 第三卫生间
     * @queryParam frequency int 保洁频次
     * @queryParam status int 厕所状态 0在用 1停用 2维修
     * @queryParam device_name string 设备名称
     * @queryParam imei char 设备唯一imei
     * @queryParam principal_id int 负责人id 外键 员工表
     * @queryParam phone string 电话
     *
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $data = SanitationToilet::find($id);
        if($data == []) {
            return response()->json(encodeMsg(["message" => "没有该公厕信息!"], 404));
        } else {
            return response()->json(encodeMsg($data,200));
        }
    }

    /**
     * 修改公厕数据
     *
     * @bodyParam id int required 表id
     * @bodyParam name string 公厕名称
     * @bodyParam number string 公厕编号
     * @bodyParam address string 公厕地址
     * @bodyParam area_id int 所属区域 外键 城市信息表
     * @bodyParam location string 经纬度-点 115.24556 25.14551
     * @bodyParam company string  所属公司
     * @bodyParam type int  厕所类型 0临时厕所 1旅游厕所 2普通厕所
     * @bodyParam man_squatting int 男蹲位
     * @bodyParam woman_squatting int 女蹲位
     * @bodyParam restroom int 无障碍卫生间
     * @bodyParam third_toilet int 第三卫生间
     * @bodyParam frequency int 保洁频次
     * @bodyParam status int 厕所状态 0在用 1停用 2维修
     * @bodyParam device_name string 设备名称
     * @bodyParam imei char 设备唯一imei
     * @bodyParam principal_id int 负责人id 外键 员工表
     * @bodyParam phone string 电话
     *
     * @queryParam name string 公厕名称
     * @queryParam number string 公厕编号
     * @queryParam address string 公厕地址
     * @queryParam area_id int 所属区域 外键 城市信息表
     * @queryParam location string 经纬度-点 115.24556 25.14551
     * @queryParam company string  所属公司
     * @queryParam type int  厕所类型 0临时厕所 1旅游厕所 2普通厕所
     * @queryParam man_squatting int 男蹲位
     * @queryParam woman_squatting int 女蹲位
     * @queryParam restroom int 无障碍卫生间
     * @queryParam third_toilet int 第三卫生间
     * @queryParam frequency int 保洁频次
     * @queryParam status int 厕所状态 0在用 1停用 2维修
     * @queryParam device_name string 设备名称
     * @queryParam imei char 设备唯一imei
     * @queryParam principal_id int 负责人id 外键 员工表
     * @queryParam phone string 电话
     *
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $sanitationToilet = SanitationToilet::find($id);
        if($sanitationToilet == []) {
            return response()->json(encodeMsg(["message" => "没有该公厕信息!"], 404));
        }
        try {
            $data = $request->all();
            $location = $request->input('location','');
            if(!empty($location)){
                $data['location'] = Point::fromString($location);
            }
            $sanitationToilet->update($data);
            return response()->json(encodeMsg($sanitationToilet,200));
        } catch (QueryException $e) {
            return response()->json(encodeMsg(['message' => '公厕信息修改失败!'],400));
        }
    }

    /**
     * 删除公厕数据
     *
     *
     * @bodyParam id int required  表ID
     * @response 204 {
     *   "message": "公厕信息删除成功"
     * }
     *
     *
     * @response 404 {
     *  "message": "没有该公厕信息"
     * }
     *
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $sanitationToilet = SanitationToilet::find($id);
        if($sanitationToilet == []) {
            return response()->json(encodeMsg(["message" => "没有该公厕信息!"], 404));
        }
        if($sanitationToilet->delete()) {
            return response()->json(encodeMsg(["message" => "公厕信息删除成功!"], 204));
        } else {
            return response()->json(encodeMsg(["message" => "公厕信息删除失败"], 400));
        }
    }

    /**
     * 批量删除公厕数据
     *
     * @bodyParam  ids int required  id集合字符串[格式：ids=1,2,3]
     * @response 204 {
     *   "message": "公厕信息删除成功"
     * }
     *
     *
     */
    public function delete($ids)
    {
        $listId = explode(',', $ids);
        SanitationToilet::whereIn('id',$listId)->delete();
        return response()->json(encodeMsg(["message" => "公厕信息删除成功!"], 204));
    }

    /**
     * 公厕数据导入 excel
     *
     * @queryParam name string 公厕名称
     * @queryParam number string 公厕编号
     * @queryParam address string 公厕地址
     * @queryParam area_id int 所属区域 外键 城市信息表
     * @queryParam areas->name string 区域名称
     * @queryParam areas->city->name string 城市名称
     * @queryParam location string 经纬度-点 115.24556 25.14551
     * @queryParam company string  所属公司
     * @queryParam type int  厕所类型 0临时厕所 1旅游厕所 2普通厕所
     * @queryParam man_squatting int 男蹲位
     * @queryParam woman_squatting int 女蹲位
     * @queryParam restroom int 无障碍卫生间
     * @queryParam third_toilet int 第三卫生间
     * @queryParam frequency int 保洁频次
     * @queryParam status int 厕所状态 0在用 1停用 2维修
     * @queryParam device_name string 设备名称
     * @queryParam imei char 设备唯一imei
     * @queryParam principal_id int 负责人id 外键 员工表
     * @queryParam phone string 电话
     *
     * @return \Illuminate\Http\Response
     */
    public function import(Request $request)
    {
        $data = excelImport($request);
        $sanitationToilet = [];
        if(!empty($data)){
            foreach ($data as $k => $v) {
                unset($v[0]);
                foreach ($v as $key => $row) {
                    DB::beginTransaction();
                    try {
                        $sanitationToilet[$k][$key]['name'] = $row[0];
                        $sanitationToilet[$k][$key]['number'] = $row[1];
                        $sanitationToilet[$k][$key]['address'] = $row[2];
                        $area_id = CarArea::where('name',$row[3])->first('id');
                        if (!empty($area_id)) {
                            $sanitationToilet[$k][$key]['area_id'] = $area_id->id;
                        }
                        if (!empty($row[4])) {
                            $sanitationToilet[$k][$key]['location'] = Point::fromString($row[4]);
                        }
                        $sanitationToilet[$k][$key]['company'] = $row[5];
                        $principal_id = Employee::where('name',$row[6])->first('id');
                        if (!empty($principal_id)) {
                            $sanitationToilet[$k][$key]['principal_id'] = $principal_id->id;
                        } else if(!empty($row[6])) {
                            $employee['name'] = $row[6];
                            $info = Employee::addData($employee);
                            $sanitationToilet[$k][$key]['principal_id'] = $info->id;
                        }
                        $sanitationToilet[$k][$key]['phone'] = $row[7];
                        $sanitationToilet[$k][$key]['man_squatting'] = $row[8];
                        $sanitationToilet[$k][$key]['woman_squatting'] = $row[9];
                        $sanitationToilet[$k][$key]['nursing_room'] = $row[10];
                        $sanitationToilet[$k][$key]['commode'] = $row[11];
                        $sanitationToilet[$k][$key]['facility'] = $row[12];
                        $sanitationToilet[$k][$key]['device_name'] = $row[13];
                        $sanitationToilet[$k][$key]['imei'] = $row[14];
                        $data = $sanitationToilet[$k][$key];
                        $res = SanitationToilet::where(function($query) use ($data){
                            if(!empty($data['location'])){
                                $query->distance('location',$data['location'],10);
                            }
                            unset($data['location']);
                            $query->where($data);
                        })->first();
                        if (empty($res)) {
                            dd($sanitationToilet[$k][$key]);
                            SanitationToilet::create($sanitationToilet[$k][$key]);
                        }
                        DB::commit();
                    } catch (QueryException $e) {
                        DB::rollBack();
                        // dd($e);
                        return response()->json(encodeMsg(['message' => '导入失败!'],400));
                    }
                }
                unset($sanitationToilet[$k][$key]);
            }
            unset($sanitationToilet[$k]);
        }
        if(Storage::disk('public')->exists('uploads/'.$request->file('file')->getClientOriginalName())) {
            return response()->json(encodeMsg(['message' => '文件已上传!'],200));
        }
    }
}
